﻿using System.Globalization;
using System.Windows.Data;

namespace XYAC.Framework.MonitorTireMaterialManual.Converters
{
    internal class NumericTextConverter : IValueConverter
    {
        /// <summary>
        /// 将源值转换为目标值时调用。
        /// 这里用于从 ViewModel 传递到 View 的时候，确保显示的文本是纯数字。
        /// </summary>
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return string.Empty;

            string input = value.ToString();
            // 仅保留数字字符
            string numeric = FilterNonNumeric(input);
            return numeric;
        }

        /// <summary>
        /// 将目标值转换回源值时调用。
        /// 这里用于从 View 传递到 ViewModel 的时候，确保输入的数据是有效的数字。
        /// </summary>
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return string.Empty;

            string input = value.ToString();
            // 仅保留数字字符
            string numeric = FilterNonNumeric(input);
            return numeric;
        }
        /// <summary>
        /// 过滤掉非数字字符，只保留数字、小数点和负号。
        /// 确保小数点不重复，负号只能出现在开头。
        /// </summary>
        /// <param name="input">输入字符串</param>
        /// <returns>仅包含有效字符的字符串</returns>
        private string FilterNonNumeric(string input)
        {
            if (string.IsNullOrEmpty(input))
                return string.Empty;

            var numeric = string.Empty;
            bool hasDecimal = false;
            bool hasNegative = false;

            for (int i = 0; i < input.Length; i++)
            {
                char c = input[i];

                if (char.IsDigit(c))
                {
                    numeric += c;
                }
                else if (c == '.' && !hasDecimal)
                {
                    numeric += c;
                    hasDecimal = true;
                }
                else if (c == '-' && i == 0 && !hasNegative)
                {
                    numeric += c;
                    hasNegative = true;
                }
                // 如果需要，可以在这里添加其他允许的字符
            }

            return numeric;
        }

    }
}
